﻿/**
        @file   TetrisGame.h
        @date   2013/01/02
        @author 임진영(deviak@deviak.com)
        @brief  테트리스 게임 클래스
*/
#ifndef TETRISGAME_H_
#define TETRISGAME_H_

#include <stdio.h>
#include <iostream>
#include <vector>

#include "Define.h"

using namespace std;

/**
        @class  TetrisGame
        @date   2013/01/02
        @author 임진영(deviak@deviak.com)
        @brief  테트리스 게임 클래스
*/

class TetrisBoard;
class TetrisBlock;

class TetrisGame
{
public:
	typedef enum { kTetrisBoardWidth = 14, kTetrisBoardHeight = 23 };			///< Tetris Board 크기
	typedef enum { kBlockTypeMax = 2, kBlockWidth = 4, kBlockHeight = 4 };		///< Tetris Block 갯 수 및 크기

public:
	TetrisGame(void);
	virtual ~TetrisGame(void);

	void			Init();								///< 테트리스 초기화
	void			Update();							///< 테트리스 정보 업데이트
	void			Render();							///< 테트리스 출력
	void			Release();							///< 메모리 해제
	void			Input();							///< 입력 처리

	void			Title();							///< 게임 타이틀 화면
	void			GameOver();							///< 게임 종료 화면
	bool			MakeBlock();						///< 랜덤으로 테트리스 Block을 생성한다
	void			DeleteBlocks();						///< 테트리스 Block을 삭제한다
	bool			CheckOver(const POSITION &p);		///< Block이 충돌이 났는지 검사한다
	bool			TurnBlock();						///< Block을 회전시킨다

	void			DrawUI();							///< UI를 출력한다

	void			IncreaseScore();					///< Score를 증가시킨다

	bool			isGameover() const { return gameover_; }	///< GameOver 상태
	void			SetGameover(bool val) { gameover_ = val; }	///< GameOver 설정
	
	int				Speed() const { return speed_; }			///< Game Speed

	TetrisBoard*	Board() const { return pBoard_; }			///< Board
	TetrisBlock*	Block() const { return pBlock_; }			///< Block

private:
	bool			gameover_;						///< GameOver 상태( true : Gameover, false : GameRun )
	

	int				score_;							///< 점수 ( 삭제한 라인 갯 수 )
	int				speed_;							///< 속도

	TetrisBoard*	pBoard_;
	TetrisBlock*	pBlock_;
	
};

#endif